package cn.com.zsw.gblog.utils;

import cn.com.zsw.gblog.vo.PageRes;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author Caizhf
 * @version 1.0
 * @date 2020/2/17 11:26
 * @description 分页工具
 **/
public class PageUtils {
    /**
     * 默认十条
     */
    public static final int DEFAULT_PAGE_SIZE = 10;
    /**
     * 默认第一页
     */
    public static final int DEFAULT_PAGE_NUM = 1;

    /**
     * 构建分页请求
     *
     * @param pageNum   请求页码
     * @param pageSize  请求记录数
     * @param isAsc     是否正序
     * @param sortFiled 排序时的order by 字段
     * @return
     */
    public static Page buildRequest(long pageNum, long pageSize, boolean isAsc, String... sortFiled) {
        Page page = new Page(pageNum, pageSize, true);
        if (sortFiled != null && sortFiled.length != 0) {
            if (isAsc) {
                page.addOrder(OrderItem.ascs(sortFiled));
            } else {
                page.addOrder(OrderItem.descs(sortFiled));
            }
        }
        return page;
    }

    /**
     * 构建分页请求
     *
     * @param pageNum  请求页码
     * @param pageSize 请求记录数
     * @return
     */
    public static Page buildRequest(long pageNum, long pageSize) {
        return new Page(pageNum, pageSize, true);
    }


    /**
     * 根据Entities构建分页返回对象，其中返回对象类型可以自定义
     *
     * @param iPage   实体Entity的Page
     * @param content DTO或者VO的List
     * @param <T>     DTO或者VO的泛型
     * @return
     */
    public static <T> PageRes<T> buildResponse(IPage iPage, List<T> content) {
        PageRes<T> pageRes = new PageRes<>(iPage, content);
        return pageRes;
    }

    /**
     * 根据请求参数自动构建分页返回对象
     *
     * @param iPage  实体Entity的page
     * @param tClazz DTO或者VO的Class类型
     * @param <T>    DTO或者VO的泛型
     * @return
     */
    public static <T> PageRes<T> buildResponse(IPage<?> iPage, Class<T> tClazz) {
        List<?> entityList = iPage.getRecords();
        if (entityList != null) {
            List<T> voList = entityList.stream().map(ent -> DozerBeanUtils.copy(ent, tClazz)).collect(Collectors.toList());
            return new PageRes<>(iPage, voList);
        }
        return buildResponse(iPage, Collections.emptyList());
    }

    /**
     * 构建分页返回对象
     *
     * @param iPage 实体Entity的page
     * @param <T>
     * @return
     */
    public static <T> PageRes<T> buildResponse(IPage<T> iPage) {
        PageRes<T> pageRes = new PageRes<>(iPage);
        return pageRes;
    }

    /**
     * 返回一个空页
     *
     * @return
     */
    public static PageRes emptyPage() {
        PageRes pageRes = new PageRes();
        pageRes.setTotal(0L);
        pageRes.setCurrent(1L);
        pageRes.setSize(0L);
        pageRes.setRecords(Collections.emptyList());
        return pageRes;
    }
}
